﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CapaLogica.CL.Usuario;
using System.Collections;
using CapaLogica.CL.Grupo;
using CapaLogica.CL.UtilidadesGenerales;
using System.Data.SqlClient;
using CapaLogica.CL.Tema;

namespace CapaLogica.CL.Foro
{
    public class GestorForo
    {
        private ForoPersistente _ForoPersist = new ForoPersistente();



        /// <summary>
        /// Listar foros de un profesor
        /// </summary>
        /// <param name="pIdProfesor">Id del profesor, tipo int</param>
        /// <remarks></remarks>
        public static List<EsForo> listarForosDeProfesorGrid(int pIdProfesor)
        {
            try
            {

                ForoPersistente persistente = new ForoPersistente();
                List<EsForo> foros = persistente.buscarForosPersona(pIdProfesor, "dbo.sp_buscar_foros_profesor", "idProfesor");


                return foros;
            }
            catch (Exception ex)
            {
                
                throw ex;
            }
        }


        /// <summary>
        /// Listar foros de un profesor
        /// </summary>
        /// <param name="pIdProfesor">Id del profesor, tipo int</param>
        /// <remarks></remarks>
        public static List<Dictionary<String, Object >> listarForosDeProfesorWeb(int pIdProfesor)
        {
            try
            {

                ForoPersistente persistente = new ForoPersistente();
                List<EsForo> foros = persistente.buscarForosPersona(pIdProfesor, "dbo.sp_buscar_foros_profesor", "idProfesor");
                Dictionary<String, Object> datos = null;
                List<Dictionary<String, Object>> datosForos = new List<Dictionary<string, Object>>();

                foreach (EsForo temp in foros)
                {
                    datos = new Dictionary<string, Object>();
                    datos.Add("id", temp.Id);
                    datos.Add("nombre", temp.Nombre);
                    datos.Add("cantidadTemas", temp.CantidadTemas);
                    datos.Add("temas", GestorTema.listarTemasDeUnForoWeb(Convert.ToInt32(temp.Id)) );
                    datosForos.Add(datos);
                }

                return datosForos;
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }




        /// <summary>
        /// Listar foros de un profesor
        /// </summary>
        /// <param name="pIdProfesor">Id del profesor, tipo int</param>
        /// <remarks></remarks>
        public static List<Dictionary<String, Object>> listarForosDeDirectorAca(int pIdDirectorAca)
        {
            try
            {

                ForoPersistente persistente = new ForoPersistente();
                List<EsForo> foros = persistente.buscarForosPersona(pIdDirectorAca, "dbo.sp_buscar_foros_director_academico", "idDirector");
                Dictionary<String, Object> datos = null;
                List<Dictionary<String, Object>> datosForos = new List<Dictionary<string, Object>>();

                foreach (EsForo temp in foros)
                {
                    datos = new Dictionary<string, Object>();
                    datos.Add("id", temp.Id);
                    datos.Add("nombre", temp.Nombre);
                    datos.Add("cantidadTemas", temp.CantidadTemas);
                    datos.Add("temas", GestorTema.listarTemasDeUnForoWeb(Convert.ToInt32(temp.Id)));
                    datosForos.Add(datos);
                }

                return datosForos;
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }


        /// <summary>
        /// Listar foros de un profesor
        /// </summary>
        /// <param name="pIdProfesor">Id del profesor, tipo int</param>
        /// <remarks></remarks>
        public static List<Dictionary<String, Object>> listarForosDeEstudianteWeb(int pIdEstudiante)
        {
            try
            {

                ForoPersistente persistente = new ForoPersistente();
                List<EsForo> foros = persistente.buscarForosPersona(pIdEstudiante, "dbo.sp_buscar_foros_estudiante", "id_estudiante");
                Dictionary<String, Object> datos = null;
                List<Dictionary<String, Object>> datosForos = new List<Dictionary<string, Object>>();

                foreach (EsForo temp in foros)
                {
                    datos = new Dictionary<string, Object>();
                    datos.Add("id", temp.Id);
                    datos.Add("nombre", temp.Nombre);
                    datos.Add("cantidadTemas", temp.CantidadTemas);
                    datos.Add("temas", GestorTema.listarTemasDeForoDeEstudiante(Convert.ToInt32(temp.Id)));
                    datosForos.Add(datos);
                }

                return datosForos;
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }


        /// <summary>
        /// Listar foros de un profesor
        /// </summary>
        /// <param name="pIdProfesor">Id del profesor, tipo int</param>
        /// <remarks></remarks>
        public static List<EsForo> listarForosDeEstudiante(int pIdEstudiante)
        {
            try
            {

                Cl_Usuario usuario = new UsuarioPersistente().buscarPorId(pIdEstudiante);
                Cl_Estudiante estudiante = new Cl_Estudiante(usuario.Cedula, usuario.Nombre, usuario.PrimerApellido, usuario.SegundoApellido, usuario.Genero,
                                            usuario.FechaNacimineto, usuario.Rol, usuario.CorreoElectronico, usuario.Contrasena);
                estudiante.Id = usuario.Id;
                List<Cl_Foro> foros = estudiante.Foros;
                List<EsForo> datosForos = new List<EsForo>();


                foreach (Cl_Foro foro in foros)
                {
                    EsForo temp = new EsForo(foro.Id + "", foro.Nombre, foro.Grupo.Curso.nombre);
                    datosForos.Add(temp);
                }


                return datosForos;
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }


        /// <summary>
        /// Metodo que devuelve todos los datos de un foro en un arraylist
        /// </summary>
        /// <param name="pIdForo">Id del foro, tipo int</param>
        /// <remarks></remarks>
        public static Dictionary<String, Object> consultarForo(int pIdForo)
        {
            Dictionary<String, object> datosForo = new Dictionary<String, object>();
            ForoPersistente persistenteForo = new ForoPersistente();
            Cl_Foro foro = persistenteForo.buscarForoPorId(pIdForo);
            
            datosForo.Add("nombre", foro.Nombre);
            datosForo.Add("numGrupo", foro.Grupo.NumGrupo+"");
            datosForo.Add("profesor", foro.Profesor.PrimerApellido+" "+foro.Profesor.SegundoApellido+" "+foro.Profesor.Nombre);
            datosForo.Add("curso", foro.Grupo.Curso.nombre);
            return datosForo;
        }



        public static Boolean validarSiEsDuenioForo(int pIdUsuario, int pIdForo){
            try 
	        {	        
		        ForoPersistente persistenteForo = new ForoPersistente();
                 Cl_Foro foro = persistenteForo.buscarForoPorId(pIdForo);

                 if (foro.Profesor.Id == pIdUsuario)
                 {
                     return true;
                 }
                 else
                 {
                     return false;
                 }

	        }
	        catch (Exception ex)
	        {
		
		        throw ex;
	        }

        }


        public static void expulsarEstudiante(int pIdForo, int pIdEstudiante, String pJustificacion)
        {         
            try
            {
                 ForoPersistente persistente = new ForoPersistente();
                 persistente.expulsarEstudiante(pIdForo, pIdEstudiante, pJustificacion, Session.Id);
            }
            catch (Exception)
            {
                
                throw;
            }
       
        }



        public static void anularExpulcionEstudiante(int pIdForo, int pIdEstudiante)
        {
            try
            {
                ForoPersistente persistente = new ForoPersistente();
                persistente.anularExpulcionEstudiante(pIdForo, pIdEstudiante, Session.Id);
            }
            catch (Exception)
            {

                throw;
            }

        }

        public static List<Informacion> listarEstudiantesExpulsadosForo(int pIdForo)
        {
            ForoPersistente persistente = new ForoPersistente();
            List<Cl_Usuario> estudiantes = persistente.buscarEstudiantesExpulsados(pIdForo);
            List<Informacion> datosEstudiantes = new List<Informacion>();

            try
            {
                foreach (Cl_Usuario temp in estudiantes)
                {
                    EsUsuario estudiante = new EsUsuario( temp.Id , temp.Cedula, temp.Nombre,
                                                        temp.PrimerApellido, temp.SegundoApellido, temp.Genero,
                                                        temp.FechaNacimineto.ToShortDateString(), temp.Rol ,
                                                        temp.Contrasena, temp.Contrasena);
                    datosEstudiantes.Add(estudiante);
                }

                return datosEstudiantes;
            }
            catch (Exception)
            {
                
                throw;
            }
        }

        public static List<Informacion> listarEstudiantesNoExpulsados(int pIdForo)
        {
            ForoPersistente persistente = new ForoPersistente();
            List<Cl_Usuario> estudiantes = persistente.buscarEstudiantesNoExpulsados(pIdForo);
            List<Informacion> datosEstudiantes = new List<Informacion>();

            try
            {
                foreach (Cl_Usuario temp in estudiantes)
                {
                    EsUsuario estudiante = new EsUsuario(temp.Id, temp.Cedula, temp.Nombre,
                                                        temp.PrimerApellido, temp.SegundoApellido, temp.Genero,
                                                        temp.FechaNacimineto.ToShortDateString(), temp.Rol,
                                                        temp.Contrasena, temp.Contrasena);
                    datosEstudiantes.Add(estudiante);
                }

                return datosEstudiantes;
            }
            catch (Exception)
            {

                throw;
            }
        }


        public static String justificacionExpulsion(int pIdForo, int pIdEstudiante)
        {
            try
            {
                ForoPersistente persistente = new ForoPersistente();

                return persistente.justificacionExpulsion(pIdForo , pIdEstudiante );
            }
            catch (Exception ex)
            {
                
                throw ex;
            }
        }


        public static List<EsForo> listarForos(int pidCarrera, int pidCurso, int pidGrupo)
        {
            try
            {
               
                ForoPersistente persistente = new ForoPersistente();
                List<EsForo> foros = persistente.buscarForos(pidCarrera, pidCurso, pidGrupo);
                if (foros.Count != 0)
                {
                    return foros;
                }
                else
                {
                    throw new Exception("No se encontró ningún foro.");

                }
          
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

    }
}
